class_name MessageObserver

## 唯一索引
var id:int
## 观察者
var observer:Node
## 最大处理时间（秒）
var maximum_processing_time:float
## 回调函数
var callback:Callable
## 是否同步之前的消息（即是否处理还未创建监听时，就已经发出的消息，但超过最大处理时间的同样不处理）
var is_sync_previous_message:bool
## 创建时帧
var init_frame:int
## 创建时Tick（毫秒）
var init_tick:int
## 当前帧
var frame:int
## 当前Tick（毫秒）
var tick:int
## 阻塞
var is_block:bool = false

func excute_callback(message:Message,is_skip_init_tick_check:bool = false):
	if is_block:
		return
	if callback.is_valid() and (message.message_tick >= init_tick or is_skip_init_tick_check) and message.message_tick > tick and message.message_tick + maximum_processing_time * 1000 >= tick:
		callback.call(message.message_namespace,message.message_tag,message.args)
		frame = maxi(frame,message.message_frame)
		tick = maxi(tick,message.message_tick)
## 判断这个Observer是否有效
func check_is_valid():
	return is_instance_valid(observer) and callback.is_valid()

func _init(m_observer:Node,m_callback:Callable = Callable(),m_maximum_processing_time:float = 5,m_is_sync_previous_message:bool = true) -> void:
	observer = m_observer
	callback = m_callback
	maximum_processing_time = m_maximum_processing_time
	is_sync_previous_message = m_is_sync_previous_message
	id = GameMessageSystem.get_id()
	init_frame = Engine.get_process_frames()
	init_tick = Time.get_ticks_msec()
	frame = -1
	tick = -1
